pointer array and array pointer {Pointer Artithmetic}


what do you mean by int (*ptr)[10]

A) ptr is an array of pointers to 10 integers

B) ptr is a pointer to an array of 10 integers

C) ptr is an array of 10 integers

D) Invalid statement


์ •๋‹ต์€ D์ธ ์ค„ ์•Œ์•˜์œผ๋‚˜ B์˜€๋‹ค. ๊ผญ ๋ณ€์ˆ˜๋ช… ์•ž์— *์„ ๋ถ™์ด๊ณ  ๊ด„ํ˜ธ๋กœ ๊ฐ์‹ผ๋‹ค๊ณ  ๊ทธ๊ฒƒ์ด ํ•จ์ˆ˜ํฌ์ธํ„ฐ๋ผ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์ฒ˜์Œ์—” ํ•จ์ˆ˜ํฌ์ธํ„ฐ์˜ ํ˜•ํƒœ type (*var_name)(args)๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ํŒ๋‹จํ•˜์—ฌ D๋ฅผ ์ฐ์€ ๊ฒƒ์ด์—ˆ๊ณ , ์‚ฌ์‹ค ์ด๊ฒƒ์€ ํฌ์ธํ„ฐ ๋ฐฐ์—ด๊ณผ ๋ฐฐ์—ด ํฌ์ธํ„ฐ ์‚ฌ์ด์˜ ๊ด€๊ณ„์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ๋ฌธ์ œ์˜€๋˜ ๊ฒƒ์ด๋‹ค.

int *ptr[10] ๋Š” ์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„ ๊ทœ์น™์— ์˜ํ•ด int * (ptr[10])์œผ๋กœ ๋ณ€ํ™˜๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ๋Œ€๋กœ ์ฝ์œผ๋ฉด int * ์›์†Œ 10๊ฐœ๋ฅผ ๋‹ด์€ ptr์ด ๋œ๋‹ค. ํƒ€์ž…์€ int *[10]์ด๋‹ค. stride๋Š” 10์ด๋‹ค.

int (*ptr)[10] ๋Š” int ์›์†Œ 10๊ฐœ๋ฅผ ๋‹ด์€ ๋ฐฐ์—ด์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ์ด๋‹ค. ํƒ€์ž…์€ int (*)[10]์ด๋‹ค. stride๋Š” 10์ด๋‹ค.

int ptr[10] ๋Š” int ์›์†Œ 10๊ฐœ๋ฅผ ๋‹ด์€ ๋ฐฐ์—ด์ด๋‹ค. ํƒ€์ž…์€ int [10]์ด๋‹ค. stride๋Š” 10์ด๋‹ค. ์ค‘์š”ํ•œ ์ ์€ ptr == &ptr์ด๋ผ๋Š” ์ ์ด๋‹ค. ์ž์„ธํ•œ ์ •๋ณด๋Š” #array pointer๋ฅผ ์ฐธ๊ณ ํ•˜๋ผ.

int *ptr ๋Š” int ์›์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ์ด๋‹ค. ํƒ€์ž…์€ int *์ด๋‹ค. stride๋Š” 1์ด๋‹ค.

array pointer and array

์ ์ ˆํ•œ ์˜ˆ์‹œ๋“ค์ด ์žˆ๊ธฐ์— ๊ฐ€์ ธ์™”๋‹ค. ๋ฐฐ์—ด์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ ptr๋Š” arr์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ’์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. *ptr์€ arr์˜ ์ฒซ๋ฒˆ์งธ ์›์†Œ์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋ ํ…๋ฐ, ์‚ฌ์‹ค ๋‘ ๊ฐ’์€ ๊ฐ™๋‹ค! ๋‚˜๋Š” ์ฒ˜์Œ์—” ๋ณ„๋„์˜ arr๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„๊ณผ ๋ฐฐ์—ด {1, 2, 3, 4, 5}๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„์ด ๋งˆ๋ จ๋œ ๋‹ค์Œ arr์ด ๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์งธ ์›์†Œ์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ’์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ–ˆ์œผ๋‚˜ ๋‚˜์˜ ์ƒ๊ฐ์ด ํ‹€๋ ธ๋‹ค.

๋‹ค๋งŒ, arr๊ณผ &arr์ด ์™„์ „ํžˆ ๊ฐ™์€ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ๋ณด๊ฒŒ๋˜๋ฉด, sizeof(arr) = 20์ธ๋ฐ ๋ฐ˜ํ•ด sizeof(&arr) = 8์ด๋ผ๋Š” ์ ์ด๋‹ค. ๋‘ ์ฐจ์ด์ ์„ ๊ถ๊ธˆํ•ด ํ•œ ์–ด๋–ค ์‚ฌ๋žŒ์ด ์งˆ๋ฌธ์„ ์˜ฌ๋ ธ๊ณ  https://stackoverflow.com/a/2528328/21369350 ์—์„œ ํ™•์ธํ•ด ๋ณด๊ธฐ ๋ฐ”๋ž€๋‹ค.

ํ•œ ๋งˆ๋””๋กœ ์ •๋ฆฌํ•˜์ž๋ฉด, arr์˜ stride๋Š” 1์ด๊ณ , &arr์˜ stride๋Š” N์ด๋‹ค.

long arr[] = {1, 2, 3, 4, 5};
long *p = arr;
long(*arrptr)[5] = &arr;
long *ptrarr[5] = {arr, arr + 1, arr + 2, arr + 3, arr + 4};
p: 140731009609168
arrptr: 140731009609168 # arrptr๋Š” &arr์ด๋‹ค
ptrarr: 140731009609200 # ptrarr๋Š” ๋ณ„๊ฐœ์˜ ๋ฐฐ์—ด์ด๋‹ค.
arr: 140731009609168 # stride 5์งœ๋ฆฌ ๋ฐฐ์—ด์˜ ์ฃผ์†Œ
&arr: 140731009609168 # stride 1์งœ๋ฆฌ 

*p: 1
*arrptr: 140731009609168 # *arrptr๋Š” arr์ด๋‹ค
*ptrarr: 140731009609168 # *ptrarr๋Š” arr์ด๋‹ค
*arr: 1

sizeof(p): 8 # pointer 8byte
sizeof(arrptr): 8 # pointer 8byte
sizeof(ptrarr): 40 # pointer 8byte * 5
sizeof(arr): 20 # int 4byte * 5
sizeof(&arr): 8 # pointer 8byte

sizeof(*p): 4
sizeof(*arrptr): 20
sizeof(*ptrarr): 8
sizeof(*arr): 4

&arr[5]: 140731009609188
&arr + 1: 140731009609188
arrptr + 1: 140731009609188
ptrarr + 1: 140731009609208